/*
 * ComponenteBaseStandar.java
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 30/11/2010, 11:15:16 AM
 */

package com.ufps.cuatro.util.base;

import java.awt.GridBagConstraints;
import java.io.File;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * <i><b>ComponenteBaseStandar:</b></i>Esta Clase permite representar los
 * controles swing soportados por la implementación.
 *
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 30/11/2010
 * @see ComponenteBase  
 */

public class ComponenteBaseStandar extends ComponenteBase{
    private static final long serialVersionUID = 3593615742649429562L;       

    private static int serialComponenteBaseStandar;
    private int idClaseComponenteBaseStandar;    
    /**
     * Cadena de Definición del Control.
     */
    protected String strClassPath;
    /**
     * Alto por defecto (Este valor es el utilizado en la Matriz de Distribución, por
     * lo tanto su valor no representa información valida para asignarlo a la propiedad
     * representada del Objeto).
     */
    protected int height;
    /**
     * Ancho por defecto (Este valor es el utilizado en la Matriz de Distribución, por
     * lo tanto su valor no representa información valida para asignarlo a la propiedad
     * representada del Objeto).
     */
    protected int width;
    /**
     * Ruta de un Archivo de Configuración utilizado, en la creación del Control.
     */
    protected String strConfig;
    /**
     * Objeto que Contiene el Archivo de Configuración que se Utilizará en la
     * creación del Control.
     */
    protected File objConfig;
    /**
     * Esta cadena representa los tokens de los Componentes Generados que soportarán
     * el Componente Generador.
     */
    protected String strObjetos;
    /**
     * Esta cadena representa los tokens de los Oyentes que soportará por defecto
     * el Componente.
     */
    protected String strOyentes;
    /**
     * Indica si el Componente es un Control Contenedor de Interfaz Gráfico, sin
     * embargo no es un contenedor de Alto Nivel.
     */
    protected boolean contenedor;
    /**
     * <p>Indica el Indice del Constructor por defecto que se utilizará para instanciar objeto
     * para la creación del Control que representa el Componente.</p>
     */
    protected int constructor;    
    /**
     * <p>Esta Collección representa las Propiedades Disponibles que soportará por
     * defecto el Control contenido en el Componente.</p>
     * <p>Entiendase por Propiedades Disponibles como Aquellas que estarán presentes
     * en la Configuración del Control al Momento de su Creación.</p>
     * Ej: setText en un JTextField.
     */    
    protected ArrayList<PropiedadComponenteBase> objPropiedadesDisponibles;
    /**
     * <p>Esta Collección representa las Propiedades Internas que soportará por
     * defecto el Control contenido en el Componente.</p>
     * <p>Entiendase por Propiedades Internas como Aquellas que estarán presentes
     * en tiempo de ejecución despues de la Creación del Control.</p>
     * Ej: getValue(int) en un JList.
     */    
    protected ArrayList<PropiedadComponenteBase> objPropiedadesInternas;    
    /**
     * Indica si el Componente esta disponible para la aplicación.
     */
    protected boolean estado;
    /**
     * Constructores Base registrados en el Componente.
     */
    protected ArrayList<ConstructorBase> objConstructoresBase; 
    /**
     * Regla de Distribución General.
     */
    protected GridBagConstraints objGridBagConstraints;
    /**
     * <p>Representa el indice de la Propiedad Beans del Control Swing.</p>
     * <p>Una Propiedad Beans es una Propiedad que se utilizará
     * para identificar el tipo de dato que devolverá el control por
     * defecto. Por ejemplo si representa un JTextField su Propiedad
     * Beans será el getText() y esta propiedad devolverá un String.
     * En Componentes Distribuidores complejos la colección de su contenido
     * tendra grupos de estas propiedad la cuales podran generar un
     * Beans con los tipos de datos que soportan.</p>
     */        
    protected int idPropiedadComponenteBeans;
    /**
     * Define id del Panel de configuracion extra para ciertos Componentes.
     */
    protected int idPanelOpciones;

    /**
     * Constructor vacio utlizado para tareas de depuración.
     */
    public ComponenteBaseStandar() {
        super();        
        this.idClaseComponenteBaseStandar = ComponenteBaseStandar.serialComponenteBaseStandar++;
    }    

    /**
     * Constructor utilizado para la creación de Componentes.
     * @param id Propiedad utilizada para identificar el indice dentro de los archivos de
     * propiedades.
     * @param strClassPath @DescripcionParametro
     * @param height @DescripcionParametro
     * @param width @DescripcionParametro
     * @param strConfig @DescripcionParametro
     * @param strObjetos @DescripcionParametro
     * @param strOyentes @DescripcionParametro
     * @param contenedor @DescripcionParametro
     * @param constructor @DescripcionParametro
     * @param estado @DescripcionParametro
     * @param modo @DescripcionParametro
     * @param strAlias @DescripcionParametro
     * @param strToolTips @DescripcionParametro
     * @param permiteModeloAsociado @DescripcionParametro
     * @param inicializacion  
     * @param idPropiedadComponenteBase 
     * @param idPanelOpciones id del Panel de configuracion extra para ciertos Componentes.
     * @DescripcionParametro
     */
    public ComponenteBaseStandar(int id, String strClassPath, int height, int width, String strConfig, String strObjetos, String strOyentes, boolean contenedor, int constructor, boolean estado, int modo, String strAlias, String strToolTips, boolean permiteModeloAsociado, boolean inicializacion, int idPropiedadComponenteBase, int idPanelOpciones) {
        super(id);
        this.strClassPath = strClassPath;
        this.height = height;
        this.width = width;
        this.strConfig = strConfig;
        this.strObjetos = strObjetos;
        this.strOyentes = strOyentes;
        this.contenedor = contenedor;
        this.constructor = constructor;
        this.estado = estado;
        this.modo = modo;
        this.strAlias = strAlias;
        this.strToolTips = strToolTips;
        this.idClaseComponenteBaseStandar = ComponenteBaseStandar.serialComponenteBaseStandar++;
        this.permiteModeloAsociado = permiteModeloAsociado;
        this.inicializacion = inicializacion;
        this.idPanelOpciones = idPanelOpciones;
        this.idPropiedadComponenteBeans = idPropiedadComponenteBase;
        this.objPropiedadesDisponibles = new ArrayList<PropiedadComponenteBase>();
        this.objPropiedadesInternas = new ArrayList<PropiedadComponenteBase>();        
    }    

    /**
     * Devuelve el Identificador del Constructor en el Archivo de Propiedades.
     * @return Identificador del Constructor.
     */
    public int getConstructor() {
        return constructor;
    }

    /**
     * Indica si el Componente es un Contenedor.
     * @return El estado del Componente.
     */
    public boolean isContenedor() {
        return contenedor;
    }

    /**
     * Devuelve el Alto del Componente para la ubicación en la Matriz de Distribución.
     * @return Alto del Componente.
     */
    public int getHeight() {
        return height;
    }    

    /**
     * Devuelve el Identificador de Clase (Usado para fines de Depuración).
     * @return Identificador de Clase.
     */    
    public int getIdClaseComponenteBaseStandar() {
       try{
            return idClaseComponenteBaseStandar;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }

    /**
     * Devuelve el Objeto Class del Control que representa el Componente.
     * @return Objeto Class.
     */
    public Class<?> getObjClassSwing() {
       try{
        try {
            return Class.forName(strClassPath);            
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ComponenteBaseStandar.class.getName()).log(Level.SEVERE, null, ex);
        }
       }catch(java.lang.NullPointerException ex){}
        return null;
    
       
    }

    /**
     * Devuelve el Archivo de Configuración para la Creación del Control que
     * representa el Componente.
     * @return Archivo de Configuración.
     */
    public File getObjConfig() {
        return objConfig;
    }

    /**
     * Devuelve el Indice actual de Generación de Objetos en la Clase.
     * @return Indice de Generación.
     */
    public static int getSerial() {
       try{
        return serialComponenteBaseStandar;
    }catch(java.lang.NullPointerException ex){}
       return 0;
    }
    
    /**
     * Devuelve el ClassPath para la Definición del Control que Representa el Control.
     * @return El ClassPath para la definición del Control.
     */
    public String getStrClassPath() {
        return strClassPath;
    }

    /**
     * Devuelve el Path del Archivo de Configuración para la Creación del Control
     * que representa el Componente.
     * @return El Path del Archivo de Configuración.
     */
    public String getStrConfig() {
        return strConfig;
    }

    /**
     * Devuelve la Cadena de Tokens de los Componentes Generados asociados.
     * @return La Cadena de Tokens de los Componentes Generados.
     */
    public String getStrObjetos() {
        return strObjetos;
    }

    /**
     * Devuelve la Cadena de Tokens de los Oyentes asociados.
     * @return La Cadena de Tokens de los Oyentes.
     */
    public String getStrOyentes() {
        return strOyentes;
    }

    /**
     * Devuelve la Collección que representa las Propiedades Disponibles que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Disponibles como Aquellas que estarán presentes
     * en la Configuración del Control al Momento de su Creación.
     * Ej: setText en un JTextField.
     * @return Collección que representa las Propiedades Disponibles que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Disponibles como Aquellas que estarán presentes
     * en la Configuración del Control al Momento de su Creación.
     * Ej: setText en un JTextField.
     */
    public ArrayList<PropiedadComponenteBase> getObjPropiedadesDisponibles() {
        return objPropiedadesDisponibles;
    }

    /**
     * Establece la Collección que representa las Propiedades Disponibles que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Disponibles como Aquellas que estarán presentes
     * en la Configuración del Control al Momento de su Creación.
     * Ej: setText en un JTextField.
     * @param objPropiedadesDisponibles Collección que representa las Propiedades Disponibles que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Disponibles como Aquellas que estarán presentes
     * en la Configuración del Control al Momento de su Creación.
     * Ej: setText en un JTextField.
     */
    public void setObjPropiedadesDisponibles(ArrayList<PropiedadComponenteBase> objPropiedadesDisponibles) {
        try{
            this.objPropiedadesDisponibles = objPropiedadesDisponibles;
        }catch(java.lang.NullPointerException ex){}
        
    }

    /**
     * Devuelve la Collección que representa las Propiedades Internas que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Internas como Aquellas que estarán presentes
     * en tiempo de ejecución despues de la Creación del Control.
     * Ej: getValue(int) en un JList.
     * @return Collección que representa las Propiedades Internas que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Internas como Aquellas que estarán presentes
     * en tiempo de ejecución despues de la Creación del Control.
     * Ej: getValue(int) en un JList.
     */
    public ArrayList<PropiedadComponenteBase> getObjPropiedadesInternas() {
        return objPropiedadesInternas;
    }

    /**
     * Establece la Collección que representa las Propiedades Internas que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Internas como Aquellas que estarán presentes
     * en tiempo de ejecución despues de la Creación del Control.
     * Ej: getValue(int) en un JList.
     * @param objPropiedadesInternas Collección que representa las Propiedades Internas que soportará por
     * defecto el Control contenido en el Componente.
     * Entiendase por Propiedades Internas como Aquellas que estarán presentes
     * en tiempo de ejecución despues de la Creación del Control.
     * Ej: getValue(int) en un JList.
     */
    public void setObjPropiedadesInternas(ArrayList<PropiedadComponenteBase> objPropiedadesInternas) {
        this.objPropiedadesInternas = objPropiedadesInternas;
    }    
    
    /**
     * Devuelve el Estado que determina si el <code>ComponenteBase</code> tiene Propiedades
     * Disponibles asignadas.
     * @return Estado que determina si el <code>ComponenteBase</code> tiene Propiedades
     * Disponibles asignadas.
     */
    public boolean tienePropiedadesDisponibles(){
        try{
            return !this.objPropiedadesDisponibles.isEmpty();
        }catch(java.lang.NullPointerException ex){}
        return false;
    }
    
    /**
     * Devuelve el Estado que determina si el <code>ComponenteBase</code> tiene Propiedades
     * Internas asignadas.
     * @return Estado que determina si el <code>ComponenteBase</code> tiene Propiedades
     * Internas asignadas.
     */
    public boolean tienePropiedadesInternas(){
        try{
            return !this.objPropiedadesInternas.isEmpty();
        }catch(java.lang.NullPointerException ex){}
        return false;
    }

    /**
     * Devuelve el Ancho del Componente para la ubicación en la Matriz de Distribución.
     * @return El Ancho del Componente.
     */
    public int getWidth() {
        return width;
    }

    /**
     * Devuelve el Estado actual del Objeto (Activado/Desactivado).
     * @return Estado del Objeto.
     */
    public boolean isEstado() {
        return estado;
    }

    /**
     * Devuelve el Modo de Representación del Control Base.
     * @return  @DescripcionParametro
     */
    public int getModo() {
        return modo;
    }

    /**
     * Establece el Modo de Representación del Control Base.
     * @param modo @DescripcionParametro
     */
    public void setModo(int modo) {
        this.modo = modo;
    }    

    /**
     * Devuelve los Constructores Base Definidos en el Componente.
     * @return Vector de Constructores Base.
     */
    public ArrayList<ConstructorBase> getObjConstructoresBase() {
        return objConstructoresBase;
    }

    /**
     * Asigna el Vector de Constrcutores Base al Componente.
     * @param objConstructoresBase @DescripcionParametro
     */
    public void setObjConstructoresBase(ArrayList<ConstructorBase> objConstructoresBase) {
        try{
            this.objConstructoresBase = objConstructoresBase;
        }catch(java.lang.NullPointerException ex){}
        
    }   

    /**
     * Devuelve el Mensaje de Ayuda del Componente Base.
     * @return Mensaje de Ayuda.
     */
    public String getStrToolTips() {
       try{ 
            return strToolTips;
        }catch(java.lang.NullPointerException ex){}
       return "";
    }

    /**
     * Asigna el Mensaje de Ayuda del Componente Base.
     * @param strToolTips @DescripcionParametro
     */
    public void setStrToolTips(String strToolTips) {
        this.strToolTips = strToolTips;
    }

    /**
     * Devuelve la Regla de Distribución General.
     * @return Regla de Distribución General.
     */
    public GridBagConstraints getObjGridBagConstraints() {
        return objGridBagConstraints;
    }

    /**
     * Establece la Regla de Distribución General.
     * @param objGridBagConstraints Regla de Distribución General.
     */
    public void setObjGridBagConstraints(GridBagConstraints objGridBagConstraints) {
        this.objGridBagConstraints = objGridBagConstraints;
    }    

    /**
     * Devuelve el Indice de la Propiedad Beans del Control Swing.
     * @return Indice de la Propiedad Beans del Control Swing.
     */
    public int getIdPropiedadComponenteBeans() {
        return idPropiedadComponenteBeans;
    }

    /**
     * Establece el Indice de la Propiedad Beans del Control Swing.
     * @param idPropiedadComponenteBeans Indice de la Propiedad Beans del Control Swing.
     */
    public void setIdPropiedadComponenteBeans(int idPropiedadComponenteBeans) {
        this.idPropiedadComponenteBeans = idPropiedadComponenteBeans;
    }

    /**
     * Devuelve el id del Panel de configuracion extra para ciertos Componentes.
     * @return id del Panel de configuracion extra para ciertos Componentes.
     */
    public int getIdPanelOpciones() {
        return idPanelOpciones;
    }

    /**
     * Establece el id del Panel de configuracion extra para ciertos Componentes.
     * @param idPanelOpciones id del Panel de configuracion extra para ciertos Componentes.
     */
    public void setIdPanelOpciones(int idPanelOpciones) {
        this.idPanelOpciones = idPanelOpciones;
    }
    
    
    
    @Override
    public String toString() {        
       try{
            return estado ? this.getObjClassSwing().getSimpleName() : this.strClassPath;
        }catch(java.lang.NullPointerException ex){}
       return "";
    }        

    @Override
    public int compareTo(Object o) {
       try{
            ComponenteBaseStandar obj = (ComponenteBaseStandar) o;
            if(this.idClaseComponenteBaseStandar > obj.idClaseComponenteBaseStandar) {
                return 1;
            }
            else if(this.idClaseComponenteBaseStandar < obj.idClaseComponenteBaseStandar) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }
}
